import os

import KBEngine
import Utils
import hotupdate
import KBEDebug as log
import MailPoller

"""
kbemain.py作为baseapp的入口，它是基于各个baseapp的，是独立存在与各个baseapp的启动流程中的。
"""

g_mail_poller = None
g_webtool_poller = None


def onBaseAppReady(isBootstrap):
    """
    KBEngine method.
    baseapp已经准备好了
    @param isBootstrap: 是否为第一个启动的baseapp
    @type isBootstrap: BOOL
    """
    log.INFO_MSG('onBaseAppReady: isBootstrap=%s, appID=%s, bootstrapGroupIndex=%s, bootstrapGlobalIndex=%s' % (isBootstrap, os.getenv("KBE_COMPONENTID"), os.getenv("KBE_BOOTIDX_GROUP"), os.getenv("KBE_BOOTIDX_GLOBAL")))

    if isBootstrap:
        Utils.createSingletonEntity('Lobby', {})
        # global g_mail_poller
        # g_mail_poller = MailPoller.MailPoller()
        # g_mail_poller.start('0.0.0.0', 30050)

        global g_webtool_poller
        g_webtool_poller = MailPoller.WebToolPoller()
        g_webtool_poller.start('0.0.0.0', 25365)


# def onAutoLoadEntityCreate(entityType, dbid):
#     """
#     服务器启动时自动加载实体，底层默认将会调用createEntityAnywhereFromDBID将实体创建到一个负载最小的baseapp上，
#     整个过程将会在第一个启动的baseapp调用onBaseAppReady之前完成。
#     """
#     DEBUG_MSG(f'onAutoLoadEntityCreate appID={os.getenv("KBE_COMPONENTID")} entityType={entityType} dbid={dbid}')
#     # KBEngine.createEntityFromDBID(entityType, dbid)
#     KBEngine.createEntityAnywhereFromDBID(entityType, dbid)


def onReadyForLogin(isBootstrap):
    """
    KBEngine method.
    如果返回值大于等于1.0则初始化全部完成, 否则返回准备的进度值0.0~1.0。
    在此可以确保脚本层全部初始化完成之后才开放登录。
    @param isBootstrap: 是否为第一个启动的baseapp
    @type isBootstrap: BOOL
    """
    return 1.0


def onReadyForShutDown():
    """
    KBEngine method.
    进程询问脚本层：我要shutdown了，脚本是否准备好了？
    如果返回True，则进程会进入shutdown的流程，其它值会使得进程在过一段时间后再次询问。
    用户可以在收到消息时进行脚本层的数据清理工作，以让脚本层的工作成果不会因为shutdown而丢失。
    """
    return True


def onBaseAppShutDown(state):
    """
    KBEngine method.
    这个baseapp被关闭前的回调函数
    @param state: 0 - 在断开所有客户端之前
                  1 - 在将所有entity写入数据库之前
                  2 - 所有entity被写入数据库之后
    @type state: int
    """
    log.INFO_MSG('onBaseAppShutDown: state=%i' % state)
    if state == 1:
        if g_mail_poller is not None:
            g_mail_poller.stop()

        if g_webtool_poller is not None:
            g_webtool_poller.stop()

        # if g_wx_auth_poller is not None:
        #     g_wx_auth_poller.stop()


def onInit(isReload):
    """
    KBEngine method.
    当引擎启动后初始化完所有的脚本后这个接口被调用
    @param isReload: 是否是被重写加载脚本后触发的
    @type isReload: bool
    """
    log.INFO_MSG('onInit::isReload:%s' % isReload)


def onFini():
    """
    KBEngine method.
    引擎正式关闭
    """
    log.INFO_MSG('onFini()')


def onCellAppDeath(addr):
    """
    KBEngine method.
    某个cellapp死亡
    """
    log.WARNING_MSG('onCellAppDeath: %s' % (str(addr)))


def onGlobalData(key, value):
    """
    KBEngine method.
    globalData有改变
    """
    log.DEBUG_MSG('onGlobalData: %s' % key)


def onGlobalDataDel(key):
    """
    KBEngine method.
    globalData有删除
    """
    log.DEBUG_MSG('onDelGlobalData: %s' % key)


def onBaseAppData(key, value):
    """
    KBEngine method.
    baseAppData有改变
    """
    log.DEBUG_MSG('onBaseAppData: %s' % key)

    if key == 'hotupdate' and value > 0:
        log.INFO_MSG('kbemain::hotupdate')
        hotupdate.reloadModule()


def onBaseAppDataDel(key):
    """
    KBEngine method.
    baseAppData有删除
    """
    log.DEBUG_MSG('onBaseAppDataDel: %s' % key)


def onLoseChargeCB(ordersID, dbid, success, datas):
    """
    KBEngine method.
    有一个不明订单被处理， 可能是超时导致记录被billing
    清除， 而又收到第三方充值的处理回调
    """
    log.DEBUG_MSG('onLoseChargeCB: ordersID=%s, dbid=%i, success=%i, datas=%s' % (ordersID, dbid, success, datas))
